package com.pangu.mark;

/**
 * 在系统中同种类型的任务在执行时必须是唯一的。<br>
 * 规则：所有的taskmark使用equal 和 hashcode 进行唯一性比较<br>
 * 所以子类必须根据合理的表示自定义实现上述两个方法。equal必须比较class类型<br>
 * 如果class不等则任务不同。
 * <p/>
 * Created by cxlin
 */
public abstract class ATaskMark {

    // 没有加载或者上此已经成功加载结束
    // 对应http ok: 200
    public static final int HANDLE_OVER = 0;
    // 加载中
    public static final int HANDLE_DOING = 1;
    // 处理错误
    // 当发生错误的时候具体的错误信息封装在对应的ServiceException中。
    public static final int HANDLE_ERROR = 2;
    // 等待加载
    public static final int HANDLE_WAIT = 3;
    // 初始为没价值或加载结束
    protected int taskStatus = HANDLE_WAIT;

    // 所依赖的任务，必须带依赖任务执行完毕，然后才能进入任务tracker阶段。<br>
    // 与视图直接相关的数据处理应该放在tracker中。
    private ATaskMark dependTask;

    // 任务类型
    // 默认TaskMark类型
    public static final int TYPE_DEFAULT = 0;
    // TaskMark的加载是刷新的类型的，比如下拉刷新
    public static final int TYPE_REFRESH = 1;
    // 任务类型，初始化是默认类型
    protected int taskType = TYPE_DEFAULT;

    // 最后执行时间
    protected long lastExecuteTime;

    public int getTaskStatus() {
        return taskStatus;
    }

    public void setTaskStatus(int taskStatus) {
        this.taskStatus = taskStatus;
    }

    public boolean isLoadEnd() {
        return taskStatus == HANDLE_OVER;
    }

    public ATaskMark getDependTask() {
        return dependTask;
    }

    public void setDependTask(ATaskMark dependTask) {
        this.dependTask = dependTask;
    }

    /**
     * 是否是pTaskMark的子任务，这将影响一些行为，比如是否影响试图的加载状态等
     *
     * @param pTaskMark
     */
    public boolean isSubTaskMarkOf(ATaskMark pTaskMark) {
        return false;
    }

    /**
     * 获取任务类型
     *
     * @return taskType
     */
    public int getTaskType() {
        return taskType;
    }

    /**
     * 设置任务类型
     *
     * @param taskType
     */
    public void setTaskType(int taskType) {
        this.taskType = taskType;
    }

    /**
     * 获取过期时间
     *
     * @return
     */
    public long getLastExecuteTime() {
        return lastExecuteTime;
    }

    /**
     * 设置过期时间
     *
     * @param lastExecuteTime
     */
    public void setLastExecuteTime(long lastExecuteTime) {
        this.lastExecuteTime = lastExecuteTime;
    }

    /**
     * 重新初始化任务，必要时子类要覆盖这个方法执行必要初始化。
     */
    public void reinitTaskMark() {
        taskStatus = HANDLE_WAIT;
        if (dependTask != null && dependTask.getDependTask() != this) {
            dependTask.reinitTaskMark();

        }
        taskType = TYPE_DEFAULT;
    }

    /**
     * 获取此TaskMark对应的cache标志的值
     * 此值用于DecoratedItemInfoCache类的缓存中用于创建cacheId
     *
     * @return
     */
    public long getCacheTagValue() {
        return getClass().getSimpleName().hashCode();
    }

    @Override
    public String toString() {
        return "ATaskMark{" +
                "taskStatus=" + taskStatus +
                ", dependTask=" + dependTask +
                ", taskType=" + taskType +
                ", lastExecuteTime=" + lastExecuteTime +
                '}';
    }
}
